home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Programming / AllPlaton / Unsorted / SFSRecover.AMOS / SFSRecover.amosSourceCode
Encoding:
AMOS Source Code  |  2000-01-20  |  9.1 KB  |  293 lines

  1. Set Buffer 100
  2. Screen Open 0,640,256,2,$8000
  3. Curs Off : Flash Off : Paper 0 : Pen 1 : Cls 
  4. Dev Open 0,"2nd.scsi.device",128,0,0
  5. Reserve As Work 9,2048
  6. ST=Start(9)
  7. Reserve As Work 10,2048
  8. ST2=Start(10)
  9. DISKREAD[ST,512,0]
  10. If Leek(ST)<> Extension_8_0998("RDSK") Then Print "No RDB-Block!" : Stop 
  11. PARTBLK=Leek(ST+28)
  12. MXNODES=60000 : MXEXTNODES=MXNODES+10000
  13. EXTNODECNT=MXNODES
  14. 'Reserve As Work 16,MXEXTNODES*14
  15.  Extension_8_0456 "bak:nodelist.raw",16
  16. NODELIST=Start(16)
  17. 'Reserve As Work 17,MXNODES*30 
  18.  Extension_8_0456 "bak:objclist.raw",17
  19. OBJLIST=Start(17)
  20. 'Reserve As Work 18,900000 
  21.  Extension_8_0456 "bak:objcname.raw",18
  22. STRBUF=Start(18) : STROFF=0
  23. Do 
  24.   Exit If PARTBLK<1
  25.   DISKREAD[ST,512,PARTBLK]
  26.   If Leek(ST)<> Extension_8_0998("PART") Then Print "Invalid partition" : Stop 
  27.   HEADS=Leek(ST+12+128) : BLKPERTRK=Leek(ST+20+128)
  28.   BLKPERCYL=HEADS*BLKPERTRK
  29.   BASE=Leek(ST+36+128)*BLKPERCYL
  30.   NUMBLK=Leek(ST+40+128)*BLKPERCYL-BASE
  31.   Print "PART BLOCK: ";PARTBLK
  32.   DEV$=Peek$(ST+37,Peek(ST+36))
  33.   Print "  Device        : ";DEV$;":"
  34.   Print "  Heads per Cyl.:";HEADS
  35.   Print "  Blks per Track:";BLKPERTRK
  36.   Print "  First block   :";BASE
  37.   Print "  Num blocks    :";NUMBLK
  38.   PARTBLK=Leek(ST+16)
  39.   DISKREAD[ST,512,BASE]
  40.   If DEV$="REC"
  41.     For A=35000 To MXNODES-1
  42.       XXX=Free
  43.       FDOBJ=OBJLIST+A*30
  44.       OBNODE=Leek(FDOBJ+4)
  45.       If OBNODE=A : Gosub EXAMINE : End If 
  46.     Next 
  47.   End If 
  48.   If DEV$="RECc"
  49.     STBLK=0 : YAHOO=64
  50.     Repeat 
  51.       STPRATE=1
  52.       Do 
  53.         DISKREAD[ST,512,STBLK*4+BASE]
  54.         If Leek(ST+8)=STBLK
  55.           If STPRATE>1
  56.             Add STBLK,-STPRATE+1
  57.           End If 
  58.           YAHOO=32 : Exit 
  59.         End If 
  60.         Dec YAHOO
  61.         Exit If YAHOO>0
  62.         STPRATE=24
  63.         Add STBLK,STPRATE
  64.         If(STBLK mod 402)=0
  65.           Print(STBLK*400)/NUMBLK;"% ";STPRATE
  66.         End If 
  67.         Exit If STBLK*4>NUMBLK,2
  68.       Loop 
  69.       DISKREAD[ST,2048,STBLK*4+BASE]
  70.       ID=Leek(ST)
  71.       If ID= Extension_8_0998("BNDC")
  72.         XXX=Free
  73.         Print Extension_8_08D2(ID);" (";STBLK;"=";Leek(ST+8);")"
  74.         NUMNODES=Deek(ST+12)
  75.         ISLEAF=Peek(ST+14)
  76.         NSIZE=Peek(ST+15)
  77.         Print "Nodes :";NUMNODES; Extension_8_16A4(" (noleafs)| (leafs)",ISLEAF);NSIZE
  78.         FDNODE=ST+16
  79.         If ISLEAF=0 : NUMNODES=0 : End If 
  80.         While NUMNODES>0
  81. '          Print "Key:";Leek(FDNODE),"Size:";Deek(FDNODE+12),"Next:";Leek(FDNODE+4),"Prev:"; 
  82.           OBNODE=Leek(FDNODE+8) and $7FFFFFFF
  83.           If Leek(FDNODE+8)<0
  84.             If OBNODE>MXNODES : Stop : End If 
  85.             Copy FDNODE,FDNODE+NSIZE To NODELIST+OBNODE*NSIZE
  86. '            Print OBNODE;" (ObjectNode)"
  87.           Else 
  88.             Copy FDNODE,FDNODE+NSIZE To NODELIST+EXTNODECNT*NSIZE
  89.             If EXTNODECNT>MXEXTNODES : Stop : End If 
  90.             Inc EXTNODECNT
  91. '            Print OBNODE;" (ExtBNode)"
  92.           End If 
  93.           Add FDNODE,NSIZE
  94.           Dec NUMNODES
  95. '          Wait Key  
  96.         Wend 
  97.         Print EXTNODECNT
  98.       End If 
  99.       If ID= Extension_8_0998("OBJC")
  100.         XXX=Free
  101.         Print Extension_8_08D2(ID);" (";STBLK;"=";Leek(ST+8);")"
  102.         PAROBJ=Leek(ST+12)
  103.         Print "Parent:";PAROBJ
  104. '        Print "Next  :";Leek(ST+16) 
  105. '        Print "Prev  :";Leek(ST+20) 
  106.         FDOBJ=ST+24
  107.         While FDOBJ<ST+2022
  108.           OBNODE=Leek(FDOBJ+4)
  109.           Exit If OBNODE=0
  110. '          PROT=Leek(FDOBJ+8) xor $F 
  111. '          DATBLK=Leek(FDOBJ+12) 
  112. '          SIZE=Leek(FDOBJ+16) 
  113. '          DATE=Leek(FDOBJ+20) 
  114. '          BITS=Peek(FDOBJ+24) 
  115.           NAME$=Peek$(FDOBJ+25,100,Chr$(0))
  116.           COMMENT$=Peek$(FDOBJ+25+Len(NAME$)+1,100,Chr$(0))
  117.           Print NAME$;" ";
  118. '          If BITS and 128 
  119. '            Print NAME$;Space$(40-Len(NAME$));"  <DIR> ";Object Protection$(PROT);" ";COMMENT$
  120. '          Else  
  121. '            Print NAME$;Space$(40-Len(NAME$));Lsstr$(SIZE,8);" ";Object Protection$(PROT);" ";COMMENT$
  122. '          End If  
  123.           If OBNODE>MXNODES : Stop : End If 
  124.           Loke FDOBJ,PAROBJ
  125.           Copy FDOBJ,FDOBJ+26 To OBJLIST+OBNODE*30
  126.           Loke OBJLIST+OBNODE*30+26,STROFF
  127.           FEND=2+Len(NAME$)+Len(COMMENT$)
  128.           Copy FDOBJ+25,FDOBJ+25+FEND To STRBUF+STROFF
  129.           Add STROFF,FEND
  130.           Add FDOBJ,25+FEND
  131.           Add FDOBJ,FDOBJ and 1
  132. '          Wait Key  
  133.         Wend 
  134.         Print " ";STROFF
  135.       End If 
  136.       Inc STBLK
  137.       If(STBLK mod 40000)=0
  138.         Print(STBLK*400)/NUMBLK;"%"
  139.       End If 
  140.     Until STBLK*4>NUMBLK
  141.   End If 
  142.   Print 
  143. Loop 
  144. Dev Close 
  145. End 
  146. EXAMINE:
  147.         PAROBJ=Leek(FDOBJ)
  148.         D$=""
  149.         While PAROBJ<>0
  150.           PARADR=OBJLIST+PAROBJ*30
  151.           If Leek(PARADR+4)=PAROBJ
  152.             D$=Peek$(STRBUF+Leek(PARADR+26),100,Chr$(0))+"/"+D$
  153.             PAROBJ=Leek(PARADR)
  154.           Else 
  155.             If PAROBJ=52 or(PAROBJ>30000) and(PAROBJ<41000)
  156.               Return 
  157.             End If 
  158.             D$="BadDir"+ Extension_8_0EB8(PAROBJ,8)+"/"+D$
  159.             Exit 
  160.           End If 
  161.         Wend 
  162.         D$="USR:"+D$
  163.         If Len(D$)>100 : D$="USR:Lost+Found/" : End If 
  164.         Trap FOO=Exist(D$)
  165.         If Errtrap : D$="USR:Lost+Found/" : End If 
  166.         If Not Exist(D$)
  167.           CNT=0 : POS=0
  168.           Do 
  169.             POS=Instr(D$,"/",POS+1)
  170.             Exit If POS=0
  171.             ND$=Left$(D$,POS)
  172.             If Not Exist(ND$)
  173.               Mkdir Extension_8_03E0(ND$)
  174.             End If 
  175.           Loop 
  176.         End If 
  177.         PROT=Leek(FDOBJ+8) xor $F
  178.         DATBLK=Leek(FDOBJ+12)
  179.         SIZE=Leek(FDOBJ+16)
  180.         DATE=Leek(FDOBJ+20)
  181.         BITS=Peek(FDOBJ+24)
  182.         NAME$=Peek$(STRBUF+Leek(FDOBJ+26),100,Chr$(0))
  183.         COMMENT$=Peek$(STRBUF+Leek(FDOBJ+26)+Len(NAME$)+1,100,Chr$(0))
  184.         If BITS and 128
  185.           Print NAME$;Space$(40-Len(NAME$));"  <DIR> "; Extension_8_0728(PROT);" ";COMMENT$
  186.           If Not Exist(D$+NAME$)
  187.             Mkdir D$+NAME$
  188.           End If 
  189.            Extension_8_0798 D$+NAME$,COMMENT$
  190.            Extension_8_0780 D$+NAME$,PROT
  191.           DD=DATE/(60*60*24)
  192.           TT1=(DATE/60) mod(24*60)
  193.           TT2=(DATE mod 60)*50
  194.            Extension_8_16F8 D$+NAME$,DD, Extension_8_0946(TT1)+TT2
  195.         Else 
  196.           Gosub SAVFILE
  197.         End If 
  198. Return 
  199. SAVFILE:
  200.           Print NAME$;Space$(40-Len(NAME$)); Extension_8_0EC8(SIZE,8);" "; Extension_8_0728(PROT);" ";COMMENT$
  201.           FDNODE=NODELIST+OBNODE*14
  202.           OBNODE=Leek(FDNODE+8) and $7FFFFFFF
  203.           If Exist(D$+NAME$)
  204.             Return 
  205.             CNT=1
  206.             Repeat 
  207.               NN$=NAME$+"."+(Str$(CNT)-" ")
  208.               Inc CNT
  209.             Until Not Exist(D$+NN$)
  210.             NAME$=NN$
  211.           End If 
  212.           If OBNODE<>A
  213.             Print "Node";OBNODE;" not found. Save anyway? (y/n)"
  214.             Repeat 
  215.               I$=Inkey$ : Multi Wait 
  216.             Until I$="y" or I$="n"
  217.             If I$="y"
  218.               Open Out 1,D$+NAME$
  219.                 STBLK=DATBLK
  220.                 While SIZE>0
  221.                   Print ".";
  222.                   DISKREAD[ST,2048,BASE+STBLK*4]
  223.                    Extension_8_17B6 1,ST To ST+Min(2048,SIZE)
  224.                   Add SIZE,-2048
  225.                   Inc STBLK
  226.                 Wend 
  227.               Close 1
  228.               Print 
  229.                Extension_8_0798 D$+NAME$,COMMENT$
  230.                Extension_8_0780 D$+NAME$,PROT
  231.               DD=DATE/(60*60*24)
  232.               TT1=(DATE/60) mod(24*60)
  233.               TT2=(DATE mod 60)*50
  234.                Extension_8_16F8 D$+NAME$,DD, Extension_8_0946(TT1)+TT2
  235.             End If 
  236.           Else 
  237.             STBLK=Leek(FDNODE)
  238.             AMTBLK=Deek(FDNODE+12)
  239.             NXTBLK=Leek(FDNODE+4)
  240.             Open Out 1,D$+NAME$
  241.               While SIZE>0
  242.                 Print ".";
  243.                 DISKREAD[ST,2048,BASE+STBLK*4]
  244.                  Extension_8_17B6 1,ST To ST+Min(2048,SIZE)
  245.                 Add SIZE,-2048
  246.                 Exit If SIZE<=0
  247.                 Inc STBLK
  248.                 Dec AMTBLK
  249.                 If AMTBLK=0
  250.                   If NXTBLK<>0
  251.                     For NN=MXNODES To MXEXTNODES
  252.                       NNODE=NODELIST+NN*14
  253.                       Exit If Leek(NNODE)=NXTBLK
  254.                     Next 
  255.                     If NN=MXEXTNODES
  256.                       Print "Node list broken!" : Wait Key 
  257.                       Close 1 : Return 
  258.                     End If 
  259.                     Print "next blocknode..."
  260.                     FDNODE=NODELIST+NN*14
  261.                     STBLK=Leek(FDNODE)
  262.                     AMTBLK=Deek(FDNODE+12)
  263.                     NXTBLK=Leek(FDNODE+4)
  264.                   Else 
  265.                     Print "Out of blocks!" : Wait Key 
  266.                     Close 1 : Return 
  267.                   End If 
  268.                 End If 
  269.               Wend 
  270.             Close 1
  271.             Print 
  272.              Extension_8_0798 D$+NAME$,COMMENT$
  273.              Extension_8_0780 D$+NAME$,PROT
  274.             DD=DATE/(60*60*24)
  275.             TT1=(DATE/60) mod(24*60)
  276.             TT2=(DATE mod 60)*50
  277.              Extension_8_16F8 D$+NAME$,DD, Extension_8_0946(TT1)+TT2
  278.           End If 
  279. Return 
  280. End 
  281. Procedure DISKREAD[AD,LE,OS]
  282.   IO=Dev Base(0)
  283.   Loke IO+36,LE : Loke IO+40,AD : Loke IO+44,OS*512
  284.   Dev Do 0,2
  285. End Proc
  286. Procedure DISKWRITE[AD,LE,OS]
  287.   IO=Dev Base(0)
  288.   Loke IO+36,LE : Loke IO+40,AD : Loke IO+44,OS*512
  289.   Dev Do 0,3
  290. End Proc
  291. Procedure DISKFLUSH
  292.   Dev Do 0,4
  293. End Proc